package com.tju.ocean_ecology_website.service.impl;

import com.tju.ocean_ecology_website.entity.Activity;
import com.tju.ocean_ecology_website.dao.ActivityDao;
import com.tju.ocean_ecology_website.service.ActivityService;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 活动表(Activity)表服务实现类
 *
 * @author shaolong
 * @since 2025-04-29 19:19:48
 */
@Service("activityService")
public class ActivityServiceImpl implements ActivityService {
    @Resource
    private ActivityDao activityDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Activity queryById(Long id) {
        return this.activityDao.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param activity 筛选条件
     * @param pageRequest      分页对象
     * @return 查询结果
     */
    @Override
    public Page<Activity> queryByPage(Activity activity, PageRequest pageRequest) {
        long total = this.activityDao.count(activity);
        return new PageImpl<>(this.activityDao.queryAllByLimit(activity, pageRequest), pageRequest, total);
    }

    /**
     * 新增数据
     *
     * @param activity 实例对象
     * @return 实例对象
     */
    @Override
    public Activity insert(Activity activity) {
        this.activityDao.insert(activity);
        return activity;
    }

    /**
     * 修改数据
     *
     * @param activity 实例对象
     * @return 实例对象
     */
    @Override
    public Activity update(Activity activity) {
        this.activityDao.update(activity);
        return this.queryById(activity.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.activityDao.deleteById(id) > 0;
    }

    /**
     * 查询项目选项
     *
     * @return 项目选项列表
     */
    @Override
    public List<Activity> queryProjectOptions() {
        return this.activityDao.queryProjectOptions();
    }

    /**
     * 根据ID列表分页查询活动
     *
     * @param activity 筛选条件
     * @param ids ID列表
     * @param pageRequest 分页对象
     * @return 查询结果
     */
    @Override
    public Page<Activity> queryByPageAndIds(Activity activity, List<Long> ids, PageRequest pageRequest) {
        if (ids == null || ids.isEmpty()) {
            return Page.empty(pageRequest);
        }

        // 这里我们使用现有的查询方法，并在内存中过滤结果
        // 注意：这不是最高效的方法，理想情况下应该在DAO层添加一个新的查询方法
        // 但为了简化实现，我们先使用这种方式

        // 获取所有符合条件的活动
        // 使用大的分页参数来获取所有数据，而不是传入null
        List<Activity> allActivities = this.activityDao.queryAllByLimit(activity, PageRequest.of(0, Integer.MAX_VALUE));

        // 过滤出指定ID的活动
        List<Activity> filteredActivities = allActivities.stream()
                .filter(a -> ids.contains(a.getId()))
                .collect(Collectors.toList());

        // 手动分页
        int start = (int) pageRequest.getOffset();
        int end = Math.min((start + pageRequest.getPageSize()), filteredActivities.size());

        // 如果起始位置超出了列表范围，返回空页
        if (start >= filteredActivities.size()) {
            return new PageImpl<>(Collections.emptyList(), pageRequest, filteredActivities.size());
        }

        // 返回分页结果
        return new PageImpl<>(
                filteredActivities.subList(start, end),
                pageRequest,
                filteredActivities.size()
        );
    }

    /**
     * 查询所有符合条件的活动
     *
     * @param activity 筛选条件
     * @return 活动列表
     */
    @Override
    public List<Activity> queryAll(Activity activity) {
        // 使用大的分页参数来获取所有数据
        return this.activityDao.queryAllByLimit(activity, PageRequest.of(0, Integer.MAX_VALUE));
    }
}
